home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / utility / cbhd502 / src / c / cookie.s next >
Text File  |  1997-01-21  |  10KB  |  317 lines

  1. ;******************
  2. ;* cookie.s:
  3. ;* Routinen für den Cookie-Jar
  4. ;*
  5. ;* $Id: cookie.s,v 1.16 1996/02/14 11:43:38 Steffen_Engel Exp Steffen_Engel $
  6. ;*
  7. ;* $Log: cookie.s,v $
  8. ;* Revision 1.16  1996/02/14  11:43:38  Steffen_Engel
  9. ;* *** empty log message ***
  10. ;*
  11. ;* Revision 1.15  1996/01/26  10:06:16  Steffen_Engel
  12. ;* getcookie liefert in D1 den Cookiewert
  13. ;*
  14. ;* Revision 1.14  1996/01/22  22:34:18  S_Engel
  15. ;* Revision_4.55
  16. ;*
  17. ;* Revision 1.13  1995/12/14  16:19:26  S_Engel
  18. ;* *** empty log message ***
  19. ;*
  20. ;* Revision 1.12  1995/11/28  19:12:34  S_Engel
  21. ;* CBHD Revision 4.50
  22. ;*
  23. ;* Revision 1.11  1995/10/19  09:12:52  S_Engel
  24. ;* *** empty log message ***
  25. ;*
  26. ;* Revision 1.10  1995/03/04  18:12:52  S_Engel
  27. ;* *** empty log message ***
  28. ;*
  29. ;# Revision 1.9  1995/03/02  13:53:48  S_Engel
  30. ;# Systemvaribalen aus atari.i
  31. ;#
  32. ;# Revision 1.8  1994/11/08  12:32:22  S_Engel
  33. ;# Standard SCSI-Kommandos nach scsicmd.s extrahiert
  34. ;# diverse kleine Geschwindigkeitssteigerungen in den TT-SCSI-Routinen
  35. ;#
  36. ;# Revision 1.7  1993/06/13  16:41:30  clausb
  37. ;# Madmac fixes
  38. ;# New function inst_new_cookie
  39. ;# Various bug fixes
  40. ;#
  41. ;* Revision 1.6  1993/03/22  21:14:10  clausb
  42. ;* V4.29 sync
  43. ;*
  44. ;* Revision 1.5  1993/01/04  08:39:22  clausb
  45. ;* getcookie vereinfacht und an TC-Konventionen angepasst
  46. ;*
  47. ;* Revision 1.4  1992/10/24  13:12:44  clausb
  48. ;* Neue Cookiefunktionen
  49. ;*
  50. ;* Revision 1.3  1992/10/21  20:02:50  clausb
  51. ;* getcookie: D1 war nicht richtig gesetzt, wenn keine Cookieliste
  52. ;* gefunden wird.
  53. ;*
  54. ;******************
  55.  
  56.         INCLUDE "cookie.i" 
  57.         INCLUDE "atari.i" 
  58.          
  59.  
  60. **********************
  61. * getcookie: Sucht nach einem Cookie in der Liste
  62. * Muss im Supervisormodus aufgerufen werden
  63. *
  64. * IN:  D0.L Gesuchtes Cookie, z.B. "_FRB" oder "CBHD"
  65. * OUT: D0.L Zeiger auf Fundstelle (wenn gefunden)
  66. * USE D0, D1, A0
  67. **********************
  68. getcookie:
  69.         movem.l d0,-(sp)                ; brauchen wir gleich noch
  70.         bsr     GetJar   
  71.         movem.l (sp)+,d0                ; und zurück
  72.         move.l  a0,d1                   ; gleich 0?
  73.         bne.s   getc1                   ; nein, weiter
  74. getcerr:
  75.         moveq   #0,d0    
  76.         moveq   #0,d1                   ; Value löschen
  77.         suba.l  a0,a0                   ; für PureC
  78.         rts              
  79. getc1:
  80.         move.l  (a0),d1                 ; Cookie holen
  81.         beq.s   getcerr                 ; gleich 0, dann raus
  82.         cmp.l   d0,d1                   ; gesuchtes Cookie?
  83.         bne.s   getcnext                ; nein, weiter
  84.  
  85.         move.l  4(a0),d1                ; Value holen
  86.         move.l  a0,d0                   ; Zeiger abliefern
  87.         rts              
  88.  
  89. getcnext:
  90.         addq.w  #8,a0                   ; nächster Eintrag
  91.         bra.s   getc1    
  92.  
  93. ***************************
  94. * installcookie: Installiere neue Cookieliste
  95. * IN: A0.L Zeiger auf neue Liste
  96. *     D0.L Größe in Cookies
  97. * USES: D1, A0, A1
  98. * TC
  99. ***************************
  100. installcookie:
  101.         movem.l a0/d0,-(sp)  
  102.         bsr     SetJar                  ; neuen Zeiger setzen
  103.         move.l  a0,a1                   ; alten nach a1
  104.         movem.l (sp)+,a0/d0  
  105.         move.l  a1,d1                   ; gab es eine alte Liste?
  106.         bne.s   instc1   
  107.  
  108.         move.l  sysbase.w,a1  
  109.         move.w  2(a1),d1                ; TOS-Version holen
  110.         cmp.w   #$106,d1                ; mindestens TOS 1.06?
  111.         bpl.s   instc2                  ; ja, weiter
  112.         bsr     resetcookie  
  113. instc2:
  114.         clr.l   (a0)                    ; Abschlußcookie installieren
  115.         move.l  d0,4(a0)  
  116.         rts              
  117. instc1:
  118.         bsr.s   copycookies  
  119.         move.l  d0,-4(a0)               ; neue Größe schreiben
  120.         rts              
  121.  
  122. ****************************
  123. * copycookies: Kopiere Cookieliste um
  124. * IN: A1.L Zeiger auf alte Liste
  125. *     A0.L Zeiger auf neue Liste
  126. * OUT: A0: Zeigt auf erstes Byte nach letztem Cookie
  127. *          in der neuen Liste
  128. * Hilfsroutine
  129. ****************************
  130. copycookies:
  131.         move.l  d0,-(sp)  
  132. copycloop:
  133.         addq.w  #8,a0    
  134.         addq.w  #8,a1    
  135.         move.l  -4(a1),-4(a0)  
  136.         move.l  -8(a1),d0  
  137.         move.l  d0,-8(a0)  
  138.         bne.s   copycloop  
  139. copycok:
  140.         move.l  (sp)+,d0  
  141.         rts              
  142.  
  143. ***************************
  144. * removecookie: Entferne Cookie aus Cookieliste
  145. * IN: D0.L Cookie
  146. * OUT: D0.L Fehlercode (0: OK, -1: Cookie nicht gefunden)
  147. * Rückgabewerte wie insertcookie
  148. * TC
  149. ***************************
  150. removecookie:
  151.         movem.l d0,-(sp)                ; brauchen wir gleich noch
  152.         bsr     GetJar   
  153.         movem.l (sp)+,d0                ; und zurück
  154.         move.l  a0,a1                   ; Zeiger auf Cookieliste
  155.         move.l  a1,d1                   ; gibt es eine Liste?
  156.         beq.s   icerr2   
  157. rc1:
  158.         move.l  4(a1),d1                ; Cookiewert
  159.         move.l  (a1),d2                 ; Cookie aus Liste holen
  160.         beq.s   icerr                   ; keiner mehr da -> Fehler
  161.         addq.w  #8,a1    
  162.         cmp.l   d0,d2                   ; Cookie gefunden?
  163.         bne.s   rc1      
  164.  
  165.         lea     -8(a1),a0               ; Zeiger für copycookies
  166.         moveq   #0,d0                   ; einrichten
  167.         bra.s   copycookies  
  168.  
  169. ***************************
  170. * insertcookie: Legt ein Cookie in einer
  171. * Cookieliste ab
  172. * IN:  D0.L Cookie
  173. *      D1.L Wert des Cookies
  174. * OUT: D0.L Fehlercode
  175. *          0:  OK
  176. *          >0: Konnte nicht eingefügt werden; Returnwert ist
  177. *              die Größe der Cookieliste in Cookies
  178. *          -1: keine Liste da
  179. ****************************
  180. insertcookie:
  181.         movem.l d1-d3/a0,-(sp)  
  182.         movem.l d0,-(sp)                ; brauchen wir gleich noch
  183.         bsr     GetJar   
  184.         movem.l (sp)+,d0                ; und zurück
  185.         move.l  a0,d2    
  186.         beq.s   icerr2   
  187.         moveq   #1,d2                   ; noch keine Cookies gefunden
  188. ic0:
  189.         addq.l  #1,d2                   ; Cookiezähler
  190.         move.l  (a0),d3                 ; Ende der Liste?
  191.         beq.s   ic1                     ; ja, weiter
  192.         addq.w  #8,a0                   ; auf nächsten Cookie
  193.                                     ; positionieren
  194.         cmp.l   d0,d3                   ; ist das unser Cookie?
  195.         bne.s   ic0                     ; nein, zurück
  196.  
  197.         move.l  d1,-4(a0)               ; neuen Wert einfügen
  198.         bra.s   icok     
  199. ic1:
  200.         move.l  4(a0),d3                ; Größe der Keksliste holen
  201.         cmp.l   d3,d2                   ; Größe der Keksliste holen
  202.         bmi.s   ic2                     ; noch Platz -> weiter
  203.  
  204. icerr:
  205.         move.l  d3,d0    
  206.         bra.s   icexit   
  207. icerr2:
  208.         moveq   #-1,d0   
  209. icexit:
  210.         movem.l (sp)+,d1-d3/a0  
  211.         rts              
  212.  
  213. ic2:
  214.         move.l  d0,(a0)+                ; neuen Cookie eintragen
  215.         move.l  (a0),8(a0)  
  216.         move.l  d1,(a0)+  
  217.         clr.l   (a0)     
  218. icok:
  219.         moveq   #0,d0    
  220.         bra.s   icexit   
  221.  
  222. ***************************
  223. * resetcookie: Installiere Resethandler
  224. * für Cookieliste.
  225. ***************************
  226. resetcookie:
  227.         move.l  resvalid.w,valsave  
  228.         move.l  resvector.w,vecsave  
  229.         move.l  #reshandler,resvector.w  
  230.         move.l  #RESMAGIC,resvalid  
  231.         rts              
  232.  
  233.         DATA             
  234. valsave:        dc.l 0
  235.         dc.l "XBRA" 
  236.         dc.l "CBHD" 
  237. vecsave:        dc.l 0
  238. reshandler:     dc.w    $4ef9           ; jmp
  239.         dc.l    preshandler             ; eigentliche Routine
  240.         TEXT             
  241. preshandler:
  242.         clr.l   cookiejar.w  
  243.         move.l  vecsave,resvector.w  
  244.         move.l  valsave,resvalid.w  
  245.         jmp     (a6)     
  246.  
  247. ****************************
  248. * inst_new_cookie:
  249. * Installiert XHDI-Cookie
  250. * IN:  A0 Zeiger auf freien Speicherbereich
  251. *         Speicher kann benutzt werden zum Anlegen
  252. *         eines neuen Cookie-Jars
  253. *      D0 Cookie-Kennung
  254. *      D1 Cookie-Wert
  255. * OUT: D0 verbrauchter Speicher
  256. *****************************
  257. inst_new_cookie:
  258.         movem.l d1/d3-d5/a3,-(sp)  
  259.         move.l  a0,a3    
  260.         moveq   #64,d3   
  261.         move.l  d0,d4    
  262.         move.l  d1,d5    
  263.         bsr     insertcookie  
  264.         bne.s   inst_own_buffer  
  265.         moveq   #0,d0    
  266. inst_cookie_exit:
  267.         movem.l (sp)+,d1/d3-d5/a3  
  268.         rts              
  269.  
  270. inst_own_buffer:
  271.         bmi.s   new_buffer  
  272.         add.l   d0,d0                   ; Puffer verdoppeln
  273.         move.l  d0,d3    
  274. new_buffer:             
  275.         move.l  d3,d0                   ; d0 Cookies installieren
  276.         move.l  a3,a0    
  277.         bsr     installcookie  
  278.         move.l  d4,d0    
  279.         move.l  d5,d1    
  280.         bsr     insertcookie  
  281.         asl.l   #3,d3    
  282.         move.l  d3,d0                   ; Cookieanzahl in Bytes umrechnen
  283.         bra.s   inst_cookie_exit  
  284.  
  285.  
  286. ******************************************************************************
  287. * Alten Cookiejar-Zeiger holen
  288. * OUT   : a0/d0 : alter Zeiger
  289. * Uses  : a0, d0
  290. GetJar:         movem.l d1-d2/a1-a2,-(sp)
  291.         move.l  #-1,-(sp)               ; inquire
  292.         move.w  #$5a0/4,-(sp)           ; Cookievektor
  293.         move.w  #5,-(sp)                ; Setexc
  294.         trap    #13                     ; BIOS
  295.         addq.l  #8,sp    
  296.         move.l  d0,a0    
  297.         movem.l (sp)+,d1-d2/a1-a2  
  298.         rts              
  299.  
  300. ******************************************************************************
  301. * Neuen Cookiejar-Zeiger eintragen
  302. * IN : a0
  303. * OUT : a0/d0 : alter Zeiger
  304. * Uses : a0, d0
  305. SetJar:         movem.l d1-d2/a1-a2,-(sp)
  306.         move.l  a0,-(sp)                ; neuer Vektor
  307.         move.w  #cookiejar/4,-(sp)      ; Cookievektor
  308.         move.w  #5,-(sp)                ; Setexc
  309.         trap    #13                     ; BIOS
  310.         addq.l  #8,sp    
  311.         move.l  d0,a0    
  312.         movem.l (sp)+,d1-d2/a1-a2  
  313.         rts              
  314.  
  315.         END              
  316.          
  317.